home *** CD-ROM | disk | FTP | other *** search
- /*------------------------------------------------------------------------------
- #
- # jGNE Hookup Code Resource Library
- #
- # jGNELib.c - Library for using the jgne code resource
- #
- # Copyright © CE Software, Inc., Inc. 1996-97
- # All rights reserved.
- #
- ------------------------------------------------------------------------------*/
- #include "jGNELib.h"
-
- // Here's all the stuff for talking to our 68k library
-
- #define kGNEHandlerGestaltType 'jGNE'
- #define kGNEHandlerResType 'CECD'
- #define kGNEHandlerResID 10
-
- typedef pascal void (*GNEHandlerActionProcPtr)(short theAction,
- long thejGNEProc,
- long refcon);
-
- typedef pascal void (*GNEHandlerInitProcPtr)(void);
-
- #if GENERATINGCFM
- enum
- {
- uppGNEHandlerInitInfo = kPascalStackBased,
- uppGNEHandlerInfo = kPascalStackBased
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof(long)))
- };
- typedef UniversalProcPtr GNEHandlerInitUPP;
- typedef UniversalProcPtr GNEHandlerUPP;
- #define NewGNEHandlerInitProc(userRoutine) \
- (GNEHandlerInitUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInitInfo, (ISAType)kM68kISA)
- #define NewGNEHandlerProc(userRoutine) \
- (GNEHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppGNEHandlerInfo, (ISAType)kM68kISA)
- #define CallGNEHandlerInitProc(userRoutine) \
- CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInitInfo)
- #define CallGNEHandlerProc(userRoutine, param1, param2, param3) \
- CallUniversalProc((UniversalProcPtr)(userRoutine), uppGNEHandlerInfo, param1, param2, param3)
- #else
- typedef GNEHandlerInitProcPtr GNEHandlerInitUPP;
- typedef GNEHandlerActionProcPtr GNEHandlerUPP;
- #define NewGNEHandlerInitProc(userRoutine) ((GNEHandlerInitUPP) (userRoutine))
- #define NewGNEHandlerProc(userRoutine) ((GNEHandlerUPP) (userRoutine))
- #define CallGNEHandlerInitProc(userRoutine) (*(userRoutine)) ()
- #define CallGNEHandlerProc(userRoutine, param1, param2, param3) \
- (*(userRoutine)) ((param1), (param2), (param3))
- #endif
-
- static GNEHandlerUPP GetGNEHandlerUPP(void)
- {
- static GNEHandlerUPP GNEHandler = nil;
-
- GNEHandlerActionProcPtr GNEHandlerProc;
- OSErr error;
- Handle hCodeProc;
- GNEHandlerInitUPP GNEHandlerInit;
-
- if (GNEHandler)
- return GNEHandler;
-
- // Try to get hot key proc ptr from Gestalt selector.
- error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
- if (error || !GNEHandlerProc)
- {
- // Load hot key code resource.
- hCodeProc = Get1Resource(kGNEHandlerResType, kGNEHandlerResID);
- if (!hCodeProc)
- return nil;
-
- // Lock it, dereference it, build its UPP, and jump right in.
- HLock(hCodeProc);
- GNEHandlerInit = NewGNEHandlerInitProc(*hCodeProc);
- CallGNEHandlerInitProc(GNEHandlerInit);
- // DO NOT UNLOCK, DETACH, OR RELEASE the hCodeProc because the init code has locked it down itself and it must not move!
- DisposeRoutineDescriptor(GNEHandlerInit);
- // Now we should be able to get the hot key proc ptr from the Gestalt selector.
- error = Gestalt(kGNEHandlerGestaltType, (long*)&GNEHandlerProc);
- if (error || !GNEHandlerProc)
- return nil;
- }
-
- // We now know that we have a non-nil hot key proc ptr.
- // Generate its routine descriptor and return it.
- GNEHandler = NewGNEHandlerProc(GNEHandlerProc);
- return GNEHandler;
- }
-
- // This refers to our hook routine
- typedef pascal Boolean (*jEventProcPtr)(EventRecord* event, long refcon);
-
- #if GENERATINGCFM
- enum
- {
- uppHookCallInfo = kPascalStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(short)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof(long)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof(long)))
- };
- typedef UniversalProcPtr GNEHookUPP;
-
- #define NewGNEHookProc(userRoutine) \
- (GNEHookUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppHookCallInfo, (ISAType)kPowerPCISA)
- #else
- typedef jEventProcPtr GNEHookUPP;
- #define NewGNEHookProc(userRoutine) ((GNEHookUPP) (userRoutine))
- #endif
-
-
- void InitjGNEProcLib(void)
- {
- GetGNEHandlerUPP();
- }
-
-
- void HookjGNE(long thejGNEProc, long refcon)
- {
- GNEHandlerUPP jGNEProc;
-
- jGNEProc = GetGNEHandlerUPP();
- if (!jGNEProc)
- return;
-
- CallGNEHandlerProc(jGNEProc, 1, (long)NewGNEHookProc(thejGNEProc), refcon);
- }
-
-
- void UnHookjGNE(void)
- {
- GNEHandlerUPP jGNEProc;
-
- jGNEProc = GetGNEHandlerUPP();
- if (!jGNEProc)
- return;
-
- CallGNEHandlerProc(jGNEProc, 2, 0, 0);
- }
-
-
-